home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 24 / Amiga Format AFCD24 (Feb 1998, Issue 108).iso / -in_the_mag- / emulation / amiga / uae-0.7.0b2 / src / sd-solaris / sound.c next >
C/C++ Source or Header  |  1998-01-20  |  2KB  |  99 lines

  1.  /* 
  2.   * UAE - The Un*x Amiga Emulator
  3.   * 
  4.   * Support for Solaris sound
  5.   * 
  6.   * Copyright 1996, 1997 Manfred Thole
  7.   */
  8.  
  9. #include "sysconfig.h"
  10. #include "sysdeps.h"
  11.  
  12. #include "config.h"
  13. #include "options.h"
  14. #include "memory.h"
  15. #include "custom.h"
  16. #include "audio.h"
  17. #include "gensound.h"
  18. #include "sounddep/sound.h"
  19. #include "events.h"
  20.  
  21. #if !defined HAVE_SYS_AUDIOIO_H
  22.  
  23. /* SunOS 4.1.x */
  24. #include <sys/ioctl.h>
  25. #include <sun/audioio.h>
  26. #ifndef AUDIO_ENCODING_LINEAR
  27. #define AUDIO_ENCODING_LINEAR (3)
  28. #endif
  29.  
  30. #else
  31.  
  32. /* SunOS 5.x */
  33. #include <sys/audioio.h>
  34.  
  35. #endif
  36.  
  37. int sndbufsize;
  38. int sound_fd;
  39. static int have_sound;
  40. uae_u16 sndbuffer[44100];
  41. uae_u16 *sndbufpt;
  42.  
  43. void close_sound(void)
  44. {
  45.     if (have_sound)
  46.     close(sound_fd);
  47. }
  48.  
  49. int setup_sound(void)
  50. {
  51.     sound_fd = open ("/dev/audio", O_WRONLY);
  52.     have_sound = !(sound_fd < 0);
  53.     if (!have_sound)
  54.       return 0;
  55.  
  56.     sound_available = 1;
  57.     return 1;
  58. }
  59.  
  60. int init_sound (void)
  61. {
  62.     int rate, dspbits;
  63.  
  64.     struct audio_info sfd_info;
  65.  
  66.     if (currprefs.sound_maxbsiz < 128 || currprefs.sound_maxbsiz > 44100) {
  67.     fprintf(stderr, "Sound buffer size %d out of range.\n", currprefs.sound_maxbsiz);
  68.     currprefs.sound_maxbsiz = 8192;
  69.     }
  70.  
  71.     rate = currprefs.sound_freq;
  72.     dspbits = currprefs.sound_bits;
  73.     AUDIO_INITINFO(&sfd_info);
  74.     sfd_info.play.sample_rate = rate;
  75.     sfd_info.play.channels = 1;
  76.     sfd_info.play.precision = dspbits;
  77.     sfd_info.play.encoding = (dspbits == 8 ) ? AUDIO_ENCODING_ULAW : AUDIO_ENCODING_LINEAR;
  78.     if (ioctl(sound_fd, AUDIO_SETINFO, &sfd_info)) {
  79.     fprintf(stderr, "Can't use sample rate %d with %d bits, %s!\n", rate, dspbits, (dspbits ==8) ? "ulaw" : "linear");
  80.     return 0;
  81.     }
  82.     sample_evtime = (long)maxhpos * maxvpos * 50 / rate;
  83.  
  84.     init_sound_table16 ();
  85.  
  86.     if (dspbits == 8) {
  87.     eventtab[ev_sample].handler = sample_ulaw_handler;
  88.     } else {
  89.     eventtab[ev_sample].handler = sample16_handler;
  90.     }
  91.  
  92.     sndbufpt = sndbuffer;
  93.     sound_available = 1;
  94.     sndbufsize = currprefs.sound_maxbsiz;
  95.     printf ("Sound driver found and configured for %d bits, %s at %d Hz, buffer is %d bytes\n", dspbits, (dspbits ==8) ? "ulaw" : "linear", rate, sndbufsize);
  96.     return 1;
  97. }
  98.  
  99.